package leetcode.code438;

import java.util.ArrayList;
import java.util.List;

public class Solution extends Solution438 {

	@Override
	public List<Integer> findAnagrams(String s, String p) {
		int[] dic = new int[26];
		for (int i = 0; i < p.length(); i++) {
			dic[p.charAt(i) - 'a'] += 1;
		}
		int ft = 0;// fast
		int sw = 0;// slow
		int lenp = p.length();// 找到答案的结束标识
		int count = 0;// 纳入答案的字符串数量
		List<Integer> result = new ArrayList<>();
		while (ft <= s.length()) {// =最后一个答案
			if (count == lenp) {// 先检查答案，应对当前ft位置可能置换sw的情况
				result.add(sw);
				count--;
				dic[s.charAt(sw) - 'a'] += 1;// 补充一个
				sw++;
			}
			if (ft < s.length()) {
				if (dic[s.charAt(ft) - 'a'] > 0) {// 属于p
					count++;// 计数器+1
					dic[s.charAt(ft) - 'a'] -= 1;// 消耗掉一个字符
					if (count == 1) {
						sw = ft;// 记录当前疑似目标的头
					}
					ft++;// 确认“是”走一步
				} else if (count > 0) {// 正在收集答案中，中断了
//					一起补充数据会出错啊，只能一个个
//					for (int i = 0; i < count; i++) {
//						dic[s.charAt(sw + i) - 'a'] += 1;// 补充回来
//					}
//					count = 0;
					dic[s.charAt(sw++) - 'a'] += 1;// 补充回来
					count--;
					// 不确定是不是不能走，当前ft位置可能是在这些补充回来的字符里，需要重新检查
				} else {
					ft++;// 确认“不是”走一步
				}
			} else {
				break;// 检查完最后一个答案，跳出
			}
		}
		return result;
	}

	public static void main(String[] args) {
		Solution so = new Solution();
		so.debug1();
		so.debug2();
		so.debug3();
//		so.debug4();
//
//		System.out.println((int) 'a' - 'a');
//		System.out.println((int) 'z' - 'a');
//		System.out.println('z' - 'a');
	}

}
